import atexit

import logging
import re
from tkinter import ttk

import requests

from src.config_util import load_config, get_config_path
from src.ui.config_tab import ConfigTab

from src.ui.download_tab import DownloadTab
from src.ui.log_tab import LogTab
from src.ui.manal_tab import ManualTab
from src.ui.schedule_tab import ScheduleTab
from src.websocket_app import WebSocketManager


class CustomsApp:
    def __init__(self, root):
        self.root = root
        self.root.protocol("WM_DELETE_WINDOW", self.on_close)  # 关闭窗口时清理资源
        self.is_running = True
        self.config_path = get_config_path()
        self.load_data()
        self.setup_ui()
        self.init_after_gui()
        # 注册程序退出时的清理函数
        atexit.register(self.cleanup_on_exit)

        # 绑定窗口关闭事件
        self.root.protocol("WM_DELETE_WINDOW", self.on_window_close)

    def setup_ui(self):
        """设置用户界面"""
        # 创建选项卡
        notebook = ttk.Notebook(self.root)

        # 下载证书选项卡
        cert_frame = ttk.Frame(notebook)
        cert_tab = DownloadTab(self)
        self.cert_tab = cert_tab
        cert_tab.setup_cert_tab(cert_frame)

        # 数据加签选项卡
        manual_frame = ttk.Frame(notebook)
        manual_tab = ManualTab(self)
        self.manual_tab = manual_tab
        manual_tab.setup_manual_tab(manual_frame)

        # 定时任务选项卡
        schedule_frame = ttk.Frame(notebook)
        schedule_tab = ScheduleTab(self)
        self.schedule_tab = schedule_tab
        schedule_tab.setup_schedule_tab(schedule_frame)

        # 设置选项卡
        config_frame = ttk.Frame(notebook)
        config_tab = ConfigTab(self)
        self.config_tab = config_tab
        config_tab.setup_config_tab(config_frame)

        # 日志查看选项卡
        log_frame = ttk.Frame(notebook)
        log_tab = LogTab(self)
        self.log_tab = log_tab
        log_tab.setup_log_tab(log_frame)

        notebook.add(cert_frame, text="下载证书")
        notebook.add(manual_frame, text="数据加签")
        notebook.add(schedule_frame, text="定时任务")
        notebook.add(config_frame, text="设置")
        notebook.add(log_frame, text="运行日志")
        notebook.pack(expand=True, fill='both', padx=10, pady=10)


    def load_data(self):
        """加载配置文件，若不存在则创建默认配置"""
        self.config = load_config()
        version_result = requests.get("https://app.singlewindow.cn/sat/swVersion.js", verify=False)
        pattern = r'url\s*=\s*"([^"]+)"'
        match = re.search(pattern, version_result.text)
        self.coustoms_client_url = match.group(1)
        self.coustoms_client_name = self.coustoms_client_url.split('/')[-1]


    def init_after_gui(self):
        """ gui渲染后的gui重新渲染操作 """
        # 检查是否启动了海关客户端
        ws_manager = WebSocketManager()
        if ws_manager.is_connected_successfully(protocol="http"):
            self.root.after(0, lambda: self.cert_tab.client_status_label.config(
                text="已安装 √ ",  # 把“等待安装客户端”改成“就绪”
                foreground="black"  # 可选：改成绿色
            ))
            self.root.after(0, lambda: self.cert_tab.cert_status_label.config(
                text="就绪 √ ",  # 把“等待安装客户端”改成“就绪”
                foreground="black"  # 可选：改成绿色
            ))
            ws_manager.close()

    def on_close(self):
        """关闭窗口时清理资源"""
        self.is_running = False
        self.schedule_tab.scheduler.stop()  # 确保任务线程终止
        self.root.destroy()

    # 添加窗口关闭处理方法
    def on_window_close(self):
        """安全关闭窗口，先移除日志处理器"""
        # 移除日志处理器，防止继续向销毁的UI写入
        if hasattr(self, 'log_handler'):
            logging.getLogger().removeHandler(self.log_handler)
            self.log_handler.close()  # 标记UI已销毁

        # 停止任务调度器
        if hasattr(self, 'scheduler'):
            self.schedule_tab.scheduler.stop()

        # 销毁窗口
        self.root.destroy()

    def cleanup(self):
        """清理资源，确保日志处理器已移除"""
        if hasattr(self, 'log_handler'):
            try:
                logging.getLogger().removeHandler(self.log_handler)
            except:
                pass

    # 增强清理方法
    def cleanup_on_exit(self):
        """程序退出时的最终清理"""
        try:
            # 确保所有线程终止
            if hasattr(self, 'scheduler') and self.scheduler.running:
                self.scheduler.stop()

            # 释放其他资源（文件、网络连接等）
            # ... 根据实际使用的资源添加 ...
        except:
            # 忽略清理时的错误，避免弹出错误窗口
            pass